/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ETL;

import java.text.DateFormatSymbols;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javassist.bytecode.analysis.Util;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
//import javax.persistence.criteria.Order;
import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.orm.PersistentException;
import smartgrid.Contract;
import smartgrid.DiaAgregado;
import smartgrid.DiaAgregadoCriteria;
import smartgrid.EltricStatsManager;
import smartgrid.MesAgregado;
import smartgrid.SemanaAgregada;
import smartgrid.VariaveisSistema;
import smartgrid.exceptions.ETLwritingDBexception;
import smartgrid.exceptions.NullOnEtlException;

/**
 *
 * @author claudio
 */
@Stateless
@LocalBean
public class ETL {

    public static GregorianCalendar postgresDateToGCalendar(Date s) {
        char[] cArray = s.toString().toCharArray();
        String ano = new String(cArray, 0, 4);
        String mes = new String(cArray, 5, 2);
        String dia = new String(cArray, 8, 2);
        return new GregorianCalendar(new Integer(ano), (new Integer(mes) - 1), new Integer(dia));
    }

    public static Date gCalenderToSqlDate(GregorianCalendar g) {
        return new Date(g.getTimeInMillis());
    }

    public Boolean povoar() {
        ArrayList<dayLine> dayLines;

        VariaveisSistema vars = VariaveisSistema.getVariaveisSistemaByORMID(1);

        GregorianCalendar ultimoPovoamentoDia = postgresDateToGCalendar(vars.getUltimoPovDia());
        GregorianCalendar ultimoPovoamentoSemana = postgresDateToGCalendar(vars.getUltimoPovSemana());
        GregorianCalendar ultimoPovoamentoMes = postgresDateToGCalendar(vars.getUltimoPovMes());
        /*       POVOAMENTO DA TABELA DIA       */
        System.out.println(ultimoPovoamentoSemana.get(Calendar.DAY_OF_MONTH));
        GregorianCalendar temp = new GregorianCalendar();
        GregorianCalendar hoje = new GregorianCalendar(temp.get(Calendar.YEAR), temp.get(Calendar.MONTH), temp.get(Calendar.DAY_OF_MONTH));
        GregorianCalendar ultimoDia = new GregorianCalendar(ultimoPovoamentoDia.get(Calendar.YEAR), ultimoPovoamentoDia.get(Calendar.MONTH), ultimoPovoamentoDia.get(Calendar.DAY_OF_MONTH));

        /*  CRIA NOVA SESSION  */
        org.hibernate.Session ss;
        SessionFactory s = new AnnotationConfiguration().configure().buildSessionFactory();
        ss = (org.hibernate.Session) s.openSession();

        System.out.println(temp.get(Calendar.MONTH));
        System.out.println(ultimoDia.get(Calendar.MONTH));
        System.out.println(ultimoPovoamentoDia.get(Calendar.MONTH));
        System.out.println(hoje.compareTo(ultimoDia));

        while (hoje.compareTo(ultimoDia) > 0) {
            try {
                dayLines = (ArrayList<dayLine>) EltricStatsManager.getDayLines(ultimoDia, ss);
                System.out.println(dayLines.size());
                if (!dayLines.isEmpty()) { /* tratar de exceptions em vez de IF  */
                    povoarTabelaDia(dayLines);
                }
                ultimoPovoamentoDia.add(Calendar.DAY_OF_MONTH, 1);
                ultimoDia = new GregorianCalendar(ultimoPovoamentoDia.get(Calendar.YEAR), ultimoPovoamentoDia.get(Calendar.MONTH), ultimoPovoamentoDia.get(Calendar.DAY_OF_MONTH));
                vars.setUltimoPovDia(gCalenderToSqlDate(ultimoPovoamentoDia));
                vars.save();
            } catch (ETLwritingDBexception ex) {
                Logger.getLogger(ETL.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        /*       POVOAMENTO DA TABELA MES       */
        hoje = new GregorianCalendar(temp.get(Calendar.YEAR), temp.get(Calendar.MONTH), temp.get(Calendar.DAY_OF_MONTH));
        while ((hoje.get(Calendar.MONTH) > ultimoPovoamentoMes.get(Calendar.MONTH))
                || (hoje.get(Calendar.YEAR) > ultimoPovoamentoMes.get(Calendar.YEAR))) {

            povoarTabelaMes((GregorianCalendar) ultimoPovoamentoMes.clone(), ss);
            ultimoPovoamentoMes.add(Calendar.MONTH, 1);
            vars.setUltimoPovMes(gCalenderToSqlDate(ultimoPovoamentoMes));
            vars.save();

        }

        /*       POVOAMENTO DA TABELA SEMANA    */
        hoje = new GregorianCalendar();
//        System.out.println(hoje.get(Calendar.WEEK_OF_YEAR));
//        System.out.println("semana pov: "+ultimoPovoamentoSemana.get(Calendar.WEEK_OF_YEAR));
//        System.out.println(hoje.get(Calendar.YEAR));
//        System.out.println("mes pov "+ultimoPovoamentoSemana.get(Calendar.MONTH));
//        System.out.println("seman ano: "+ultimoPovoamentoSemana.get(Calendar.YEAR));
//        System.out.println((hoje.get(Calendar.WEEK_OF_YEAR) > ultimoPovoamentoSemana.get(Calendar.WEEK_OF_YEAR)) + "qualquer merda" + (hoje.get(Calendar.YEAR) > ultimoPovoamentoSemana.get(Calendar.YEAR)));
        while ((hoje.get(Calendar.WEEK_OF_YEAR) > ultimoPovoamentoSemana.get(Calendar.WEEK_OF_YEAR))
                || ((ultimoPovoamentoSemana.get(Calendar.MONTH) == 0 && (ultimoPovoamentoSemana.get(Calendar.WEEK_OF_YEAR) > 4))
                && hoje.get(Calendar.YEAR) == ultimoPovoamentoSemana.get(Calendar.YEAR))) {
//            System.out.println("qualquer merda");
            try {
                povoarTabelaSemana((GregorianCalendar) ultimoPovoamentoSemana.clone());

                ultimoPovoamentoSemana.add(Calendar.WEEK_OF_YEAR, 1);
                vars.setUltimoPovSemana(gCalenderToSqlDate(ultimoPovoamentoSemana));
                vars.save();
            } catch (Exception ex) {
                Logger.getLogger(ETL.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return true;
    }

    /* VER MELHOR ISTO DAS TRANSACOES                          */
    /* http://community.jboss.org/wiki/SessionsAndTransactions */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    private void povoarTabelaDia(ArrayList<dayLine> dayLines) throws ETLwritingDBexception {
        Iterator<dayLine> i = dayLines.iterator();
        DiaAgregado dia;
        dayLine d;

        while (i.hasNext()) {
            dia = new DiaAgregado();
            d = i.next();
            dia.setContract(Contract.getContractByORMID(d.getContractID()));
            dia.setData(d.getData().getTime());
            dia.setGastoAVG(d.getGastoAVG());
            dia.setGastoSUM(d.getGastoSUM());
            dia.setUnidade(d.getUnidade());
            dia.setPrecoAVG(d.getPrecoAVG());
            dia.setPrecoSUM(d.getPrecoSUM());
            boolean save = dia.save();
            if (!save) {
                throw new ETLwritingDBexception();
            }
        }
    }

    private void povoarTabelaMes(GregorianCalendar begin, org.hibernate.Session ss) {
        begin.set(Calendar.DAY_OF_MONTH, 1);
        GregorianCalendar end = (GregorianCalendar) begin.clone();
        end.add(Calendar.MONTH, 1);
        end.add(Calendar.DAY_OF_MONTH, -1);


        Date d;
        int ano;
        int mes;
        int dia;

        String data_fim = (end.get(Calendar.YEAR)) + "-" + (end.get(Calendar.MONTH) + 1) + "-" + end.get(Calendar.DAY_OF_MONTH);;
        String data_inicio = (begin.get(Calendar.YEAR)) + "-" + (begin.get(Calendar.MONTH) + 1) + "-" + begin.get(Calendar.DAY_OF_MONTH);
        //ss= s.getCurrentSession();

        List<Object[]> monthLines = ss.createSQLQuery("select contractid, "
                + " SUM(gastosum) as \"gastosum\", "
                + "(select unidade from diaagregado d2 where d2.contractid = d.contractid limit 1) as \"unidade\", "
                + " SUM(precosum) as \"precosum\", "
                + "AVG(gastoavg) as \"gastoavg\", "
                + "AVG(precoavg) as \"precoavg\" "
                + "from diaagregado d "
                + "where data between '" + data_inicio + "' and '" + data_fim + "' "
                + "group by contractid").addScalar("contractid", Hibernate.INTEGER).addScalar("gastosum", Hibernate.DOUBLE).addScalar("unidade", Hibernate.STRING).addScalar("precosum", Hibernate.DOUBLE).addScalar("gastoavg", Hibernate.DOUBLE).addScalar("precoavg", Hibernate.DOUBLE).list();

        System.out.println("Tamanho: " + monthLines.size());
        dayLine b;
        Object[] bb;
        // for(MesAgregado mes : datalines)
        MesAgregado mes_ag;
        for (Object[] a : monthLines) {
            bb = a;
            mes_ag = new MesAgregado();
            mes_ag.setContract(Contract.getContractByORMID((Integer) bb[0]));
            mes_ag.setGastoSUM((Double) bb[1]);
            mes_ag.setUnidade((String) bb[2]);
            mes_ag.setPrecoSUM((Double) bb[3]);
            mes_ag.setGastoAVG((Double) bb[4]);
            mes_ag.setPrecoAVG((Double) bb[5]);
            mes_ag.setData(gCalenderToSqlDate((GregorianCalendar) begin.clone()));

            System.out.print("-----------------------------------------\n");
            System.out.println("ID " + mes_ag.getContract().getID());
            System.out.println("gastoAVG " + mes_ag.getGastoAVG());
            System.out.println("gastoSUM " + mes_ag.getGastoSUM());
            System.out.println("precoAVG " + mes_ag.getPrecoAVG());
            System.out.println("precoSUM " + mes_ag.getPrecoSUM());
            System.out.println("Dia " + mes_ag.getData().toString());
            // System.out.println("Data " + mes_ag.getData().getDay());

            mes_ag.save();
        }



    }

    private void povoarTabelaSemana(GregorianCalendar cal) throws ETLwritingDBexception, PersistentException, NullOnEtlException {

        /* Define semana a processar */
        GregorianCalendar startDate = corrigeSemanaParaDomingo(cal);
        imprimirData(startDate);
        GregorianCalendar endDate = (GregorianCalendar) startDate.clone();
        endDate.add(Calendar.DAY_OF_MONTH, 6);
        imprimirData(endDate);



        /* Cria Filtro para buscar 7 linhas da Tabela diaAgregado por cada contrato */
        DiaAgregadoCriteria crit = new DiaAgregadoCriteria();
        crit.add(Restrictions.between("data", gCalenderToSqlDate(startDate), gCalenderToSqlDate(endDate)));
        crit.addOrder(Order.asc("contract.id")).addOrder(Order.asc("data"));

        /* Ciclo que por cada 7 linhas cria um registo na tabelaSemanal. 
         * Se não existir nao insere e passa ao proximo contrato*/
        int diaDaSemana = 1, contratoAnterior, dispararException = 0;
        DiaAgregado dia;
        SemanaAgregada s = new SemanaAgregada();

        DiaAgregado[] dias = DiaAgregado.listDiaAgregadoByCriteria(crit);
        System.out.println("------------" + dias.length);
        if (!(Arrays.asList(dias).isEmpty())) {
            Iterator<DiaAgregado> i = (Arrays.asList(dias)).iterator();
            contratoAnterior = i.next().getContract().getID();
            for (int j = 0; j < dias.length; j++) {
                dia = dias[j];
                System.out.print(" " + diaDaSemana + " ");

                switch (postgresDateToGCalendar((java.sql.Date) dia.getData()).get(Calendar.DAY_OF_WEEK)) {
                    case 1: /* Domingo */
                        s.setDomingoGastoAVG(dia.getGastoAVG());
                        s.setDomingoGastoSUM(dia.getGastoSUM());
                        s.setDomingoPrecoAVG(dia.getPrecoAVG());
                        s.setDomingoPrecoSUM(dia.getPrecoSUM());
                        break;
                    case 2: /* Segunda */
                        s.setSegundaGastoAVG(dia.getGastoAVG());
                        s.setSegundaGastoSUM(dia.getGastoSUM());
                        s.setSegundaPrecoAVG(dia.getPrecoAVG());
                        s.setSegundaPrecoSUM(dia.getPrecoSUM());
                        break;
                    case 3: /* Terca */
                        s.setTercaGastoAVG(dia.getGastoAVG());
                        s.setTercaGastoSUM(dia.getGastoSUM());
                        s.setTercaPrecoAVG(dia.getPrecoAVG());
                        s.setTercaPrecoSUM(dia.getPrecoSUM());
                        break;
                    case 4: /* Quarta */
                        s.setQuartaGastoAVG(dia.getGastoAVG());
                        s.setQuartaGastoSUM(dia.getGastoSUM());
                        s.setQuartaPrecoAVG(dia.getPrecoAVG());
                        s.setQuartaPrecoSUM(dia.getPrecoSUM());
                        break;
                    case 5: /* Quinta */
                        s.setQuintaGastoAVG(dia.getGastoAVG());
                        s.setQuintaGastoSUM(dia.getGastoSUM());
                        s.setQuintaPrecoAVG(dia.getPrecoAVG());
                        s.setQuintaPrecoSUM(dia.getPrecoSUM());
                        break;
                    case 6: /* Sexta */
                        s.setSextaGastoAVG(dia.getGastoAVG());
                        s.setSextaGastoSUM(dia.getGastoSUM());
                        s.setSextaPrecoAVG(dia.getPrecoAVG());
                        s.setSextaPrecoSUM(dia.getPrecoSUM());
                        break;
                    case 7: /* Sabado */
                        s.setSabadoGastoAVG(dia.getGastoAVG());
                        s.setSabadoGastoSUM(dia.getGastoSUM());
                        s.setSabadoPrecoAVG(dia.getPrecoAVG());
                        s.setSabadoPrecoSUM(dia.getPrecoSUM());
                        break;
                    default:
                        throw new NullOnEtlException();
                }
                if ((j != dias.length - 1)) {
                    if (contratoAnterior != dias[j + 1].getContract().getID()) {
                        if (diaDaSemana == 7) {
                            diaDaSemana = 0;
                            s.setContract(dia.getContract());
                            s.setUnidade(dia.getUnidade());
                            s.setData(gCalenderToSqlDate(startDate));
                            s.save();
                            System.out.println("Gravou");
                            s = new SemanaAgregada();
                            contratoAnterior = dias[j + 1].getContract().getID();
                        } else {
                            System.out.println("Falhou!");
                            diaDaSemana = 0;
                            s = new SemanaAgregada();
                        }
                    }
                } else {
                    if (diaDaSemana == 7) {
                        s.setContract(dia.getContract());
                        s.setUnidade(dia.getUnidade());
                        s.setData(gCalenderToSqlDate(startDate));
                        s.save();
                        System.out.println("Gravou");
                    }
                }
                diaDaSemana++;
            }
//        if (dispararException == 1) /* Significa que houve informação que não foi materializada por falta de dados */ {
//            throw new NullOnEtlException();
//        }




        }
    }

    private static GregorianCalendar corrigeSemanaParaDomingo(GregorianCalendar c) {
        if (c.get(Calendar.DAY_OF_WEEK) != 1) {
            c.add(Calendar.DAY_OF_YEAR, -(c.get(Calendar.DAY_OF_WEEK) - 1));
        }
        return c;
    }

    public static void imprimirData(GregorianCalendar c) {
        String[] weekdays = new DateFormatSymbols().getWeekdays();
        System.out.println(c.get(Calendar.YEAR) + " - " + (c.get(Calendar.MONTH) + 1) + " - " + c.get(Calendar.DAY_OF_MONTH) + ", " + weekdays[c.get(Calendar.DAY_OF_WEEK)]);
    }

    public static void main(String[] args) throws PersistentException {
        ETL e = new ETL();
        e.povoar();

//        GregorianCalendar cal = new GregorianCalendar(2011, 04, 2);
//        /* Define semana a processar */
//        GregorianCalendar startDate = corrigeSemanaParaDomingo(cal);
//        imprimirData(startDate);
//        GregorianCalendar endDate = (GregorianCalendar) startDate.clone();
//        endDate.add(Calendar.DAY_OF_MONTH, 6);
//        imprimirData(endDate);
//
//
//        /* Cria Filtro para buscar 7 linhas do diaAgregado */
//        DiaAgregadoCriteria crit = new DiaAgregadoCriteria();
//        crit.add(Restrictions.between("data", gCalenderToSqlDate(startDate), gCalenderToSqlDate(endDate)));
//        crit.addOrder(Order.asc("contract.id")).addOrder(Order.asc("data"));
//
//        DiaAgregado[] dias = DiaAgregado.listDiaAgregadoByCriteria(crit);
//        for (DiaAgregado a : dias) {
//            System.out.println(a.getContract().getID() + " " + a.getData().toString() + " " + a.getGastoAVG());
//        }
        //        c.add(Calendar.WEEK_OF_YEAR, 1);
        //        c.add(Calendar.WEEK_OF_YEAR, -1);
        //
        //        System.out.println("Data hoje: " + c.get(Calendar.YEAR) + " - " + c.get(Calendar.MONTH) + " - " + c.get(Calendar.DAY_OF_MONTH));
        //        System.out.println("Semana: " + c.get(Calendar.WEEK_OF_YEAR));
        //        System.out.println("DiaDaSemana: " + c.get(Calendar.DAY_OF_WEEK));
        //
        //        c = corrigeSemanaParaDomingo(c);
        //        System.out.println("Data hoje: " + c.get(Calendar.YEAR) + " - " + c.get(Calendar.MONTH) + " - " + c.get(Calendar.DAY_OF_MONTH));
        //        System.out.println("Semana: " + c.get(Calendar.WEEK_OF_YEAR));
        //        System.out.println("DiaDaSemana: " + c.get(Calendar.DAY_OF_WEEK));
        //
        //        c.add(Calendar.DAY_OF_YEAR, 1);
        //        System.out.println("Data hoje: " + c.get(Calendar.YEAR) + " - " + c.get(Calendar.MONTH) + " - " + c.get(Calendar.DAY_OF_MONTH));
        //        System.out.println("Semana: " + c.get(Calendar.WEEK_OF_YEAR));
        //        System.out.println("DiaDaSemana: " + c.get(Calendar.DAY_OF_WEEK));
        //
        //
        //        System.out.println("-----------");
        //        c.add(Calendar.WEEK_OF_YEAR, 1);
        //        System.out.println("Data semana anterior: " + c.get(Calendar.YEAR) + " - " + c.get(Calendar.MONTH) + " - " + c.get(Calendar.DAY_OF_MONTH));
        //        System.out.println("Semana: " + c.get(Calendar.WEEK_OF_YEAR));
        //
        //        c.add(Calendar.WEEK_OF_YEAR, 1);
        //        System.out.println("Data duas semanas antes: " + c.get(Calendar.YEAR) + " - " + c.get(Calendar.MONTH) + " - " + c.get(Calendar.DAY_OF_MONTH));
        //        System.out.println("Semana: " + c.get(Calendar.WEEK_OF_YEAR));
        //        VariaveisSistema vars = VariaveisSistema.getVariaveisSistemaByORMID(1);
        //
        //        GregorianCalendar c = postgresDateToGCalendar(vars.getUltimoPovDia());
        //        GregorianCalendar c1 = postgresDateToGCalendar(vars.getUltimoPovMes());
        //        GregorianCalendar c2 = postgresDateToGCalendar(vars.getUltimoPovSemana());
        //
        //        System.out.println("UltimoPovoamentoDia: " + c.get(Calendar.YEAR) + " - " + c.get(Calendar.MONTH) + " - " + c.get(Calendar.DAY_OF_MONTH));
        //        System.out.println("UltimoPovoamentoDia: " + c1.get(Calendar.YEAR) + " - " + c1.get(Calendar.MONTH) + " - " + c1.get(Calendar.DAY_OF_MONTH));
        //        System.out.println("UltimoPovoamentoDia: " + c2.get(Calendar.YEAR) + " - " + c2.get(Calendar.MONTH) + " - " + c2.get(Calendar.DAY_OF_MONTH));
        //
        //        GregorianCalendar g = new GregorianCalendar(2011, 06, 16);
        //        String[] weekdays = new DateFormatSymbols().getWeekdays();
        //        System.out.println("day of week " + weekdays[g.get(Calendar.DAY_OF_WEEK)]);
        //        vars.setUltimoPovDia(gCalenderToSqlDate(g));
        //        vars.save();
    }
}
//        GregorianCalendar start = new GregorianCalendar();
//        start.add(Calendar.MONTH, -1);
//        start.set(Calendar.DAY_OF_MONTH, 1);
//        GregorianCalendar end = new GregorianCalendar();
//        end.set(Calendar.DAY_OF_MONTH, 1);
//        end.add(Calendar.DAY_OF_MONTH, -1);
//
//        GregorianCalendar hoje = new GregorianCalendar();
//        System.out.println("HOJE:\nDia " + hoje.get(Calendar.DAY_OF_MONTH));
//        System.out.println("Mes " + hoje.get(Calendar.MONTH));
//
//        System.out.println("START:\nDia " + start.get(Calendar.DAY_OF_MONTH));
//        System.out.println("Mes " + start.get(Calendar.MONTH));
//
//        System.out.println("END:\nDia " + end.get(Calendar.DAY_OF_MONTH));
//        System.out.println("Mes " + end.get(Calendar.MONTH));
//
//        GregorianCalendar hojerrrr = new GregorianCalendar();
//        GregorianCalendar hojetemp = (GregorianCalendar) hojerrrr.clone();
//        hojerrrr.add(Calendar.DAY_OF_MONTH, 1);
//        hoje = new GregorianCalendar(hojetemp.get(Calendar.YEAR), hojetemp.get(Calendar.MONTH), hojetemp.get(Calendar.DAY_OF_MONTH));
//        GregorianCalendar ultimoDia = new GregorianCalendar(hojerrrr.get(Calendar.YEAR), hojerrrr.get(Calendar.MONTH), hojerrrr.get(Calendar.DAY_OF_MONTH));
//
//        hoje.add(Calendar.DAY_OF_MONTH, -1);
//        System.out.println(hoje.compareTo(ultimoDia));
//        ETL e = new ETL();
//        hoje.add(Calendar.DAY_OF_MONTH, -1);
//        if (hoje.compareTo(ultimoDia) == 0) {
//            try {
//                dayLines = dayLine.getDatelines(hoje);
//                povoarTabelaDia(dayLines);
//                ultimoPovoamentoDia.add(Calendar.DAY_OF_MONTH, 1);/* TODO: falta gravar isto na BD*/
//
//            } catch (ETLwritingDBexception ex) {
//                Logger.getLogger(ETL.class.getName()).log(Level.SEVERE, null, ex);
//            }
//
//        } else if (hoje.compareTo(ultimoDia) == 1) {
//            temp = new GregorianCalendar(ultimoPovoamentoDia.get(Calendar.YEAR), ultimoPovoamentoDia.get(Calendar.MONTH), ultimoPovoamentoDia.get(Calendar.DAY_OF_MONTH));
//            hoje.add(Calendar.DAY_OF_MONTH, 1);
//            while (hoje.compareTo(temp) != 0) {
//                
//                try {
//                    dayLines = dayLine.getDatelines(temp);
//                    povoarTabelaDia(dayLines);
//                    temp.add(Calendar.DAY_OF_MONTH, 1);
//                    ultimoPovoamentoDia = (GregorianCalendar) temp.clone();/* TODO: falta gravar isto na BD*/
//                } catch (ETLwritingDBexception ex) {
//                    Logger.getLogger(ETL.class.getName()).log(Level.SEVERE, null, ex);
//                }
//            }
//        }
//        if (!(hoje.get(Calendar.MONTH) == ultimoPovoamentoMes.get(Calendar.MONTH)
//                && hoje.get(Calendar.YEAR) == ultimoPovoamentoMes.get(Calendar.YEAR))) {
//            hoje.add(Calendar.MONTH, -1);
//            if (hoje.get(Calendar.MONTH) == ultimoPovoamentoMes.get(Calendar.MONTH)
//                    && hoje.get(Calendar.YEAR) == ultimoPovoamentoMes.get(Calendar.YEAR)) {
//                try {
//                    povoarTabelaMes(hoje);
//                } catch (ETLwritingDBexception ex) {
//                    Logger.getLogger(ETL.class.getName()).log(Level.SEVERE, null, ex);
//                }
//                ultimoPovoamentoMes.add(Calendar.MONTH, 1);/* TODO: falta gravar isto na BD*/
//            } else {
//                hoje = new GregorianCalendar();
//                temp = (GregorianCalendar) ultimoPovoamentoMes.clone();
//                while (temp.get(Calendar.MONTH) != hoje.get(Calendar.MONTH)) {
//                    try {
//                        povoarTabelaMes(temp);
//                        temp.add(Calendar.MONTH, 1);
//                        ultimoPovoamentoDia = (GregorianCalendar) temp.clone();/* TODO: falta gravar isto na BD*/
//                    } catch (ETLwritingDBexception ex) {
//                        Logger.getLogger(ETL.class.getName()).log(Level.SEVERE, null, ex);
//                    }
//                }
//            }
//        }
